#include "grayscale.h"


extern Timer_typeDef timer;


LED_TypeDef Grayscale1_led[10] = {
    {LED1_1_PORT,  LED1_1_PIN},
    {LED1_2_PORT,  LED1_2_PIN},
    {LED1_3_PORT,  LED1_3_PIN},
    {LED1_4_PORT,  LED1_4_PIN},
    {LED1_5_PORT,  LED1_5_PIN},
    {LED1_6_PORT,  LED1_6_PIN},
    {LED1_7_PORT,  LED1_7_PIN},
    {LED1_8_PORT,  LED1_8_PIN},
    {LED1_9_PORT,  LED1_9_PIN},
    {LED1_10_PORT, LED1_10_PIN} 
};

// LED_TypeDef Grayscale2_led[10] = {
//     {LED2_1_PORT,  LED2_1_PIN},
//     {LED2_2_PORT,  LED2_2_PIN},
//     {LED2_3_PORT,  LED2_3_PIN},
//     {LED2_4_PORT,  LED2_4_PIN},
//     {LED2_5_PORT,  LED2_5_PIN},
//     {LED2_6_PORT,  LED2_6_PIN},
//     {LED2_7_PORT,  LED2_7_PIN},
//     {LED2_8_PORT,  LED2_8_PIN},
//     {LED2_9_PORT,  LED2_9_PIN},
//     {LED2_10_PORT, LED2_10_PIN} 
// };


uint32_t GRAY1_Judge(GPIO_Regs *GPIOx, uint32_t GPIO_Pin)
{
    for (int i = 0; i < 10; i++) 
		{
        if (Grayscale1_led[i].port == GPIOx && 
			Grayscale1_led[i].pin == GPIO_Pin && 
			DL_GPIO_readPins(GPIOx,GPIO_Pin) == 0) 
                return 1 << i;  // 返回 2 的 i 次方
    }
    return 0;
}


uint32_t GRAY1_Calc(void)
{
	uint32_t GrayNum = 
		GRAY1_Judge(LED1_1_PORT,LED1_1_PIN)+GRAY1_Judge(LED1_2_PORT,LED1_2_PIN)+GRAY1_Judge(LED1_3_PORT,LED1_3_PIN)+
		GRAY1_Judge(LED1_4_PORT,LED1_4_PIN)+GRAY1_Judge(LED1_5_PORT,LED1_5_PIN)+GRAY1_Judge(LED1_6_PORT,LED1_6_PIN)+
		GRAY1_Judge(LED1_7_PORT,LED1_7_PIN)+GRAY1_Judge(LED1_8_PORT,LED1_8_PIN)+GRAY1_Judge(LED1_9_PORT,LED1_9_PIN)+
		GRAY1_Judge(LED1_10_PORT,LED1_10_PIN);
	return GrayNum;
}


// uint32_t GRAY2_Judge(GPIO_Regs *GPIOx, uint32_t GPIO_Pin)
// {
//     for (int i = 0; i < 10; i++) 
// 		{
//         if (Grayscale2_led[i].port == GPIOx && 
// 			Grayscale2_led[i].pin == GPIO_Pin &&
// 			DL_GPIO_readPins(GPIOx,GPIO_Pin) == 0)
//                 return 1 << i; 
//     }
//     return 0;
// }


// uint32_t GRAY2_Calc(void)
// {
// 	uint32_t GrayNum = 
// 		GRAY2_Judge(LED2_1_PORT,LED2_1_PIN)+GRAY2_Judge(LED2_2_PORT,LED2_2_PIN)+GRAY2_Judge(LED2_3_PORT,LED2_3_PIN)+
// 		GRAY2_Judge(LED2_4_PORT,LED2_4_PIN)+GRAY2_Judge(LED2_5_PORT,LED2_5_PIN)+GRAY2_Judge(LED2_6_PORT,LED2_6_PIN)+
// 	    GRAY2_Judge(LED2_7_PORT,LED2_7_PIN)+GRAY2_Judge(LED2_8_PORT,LED2_8_PIN)+GRAY2_Judge(LED2_9_PORT,LED2_9_PIN)+
// 		GRAY2_Judge(LED2_10_PORT,LED2_10_PIN);
// 	return GrayNum;
// }


/**
 * @brief  灰度多次读取
 * @param  灰度读取数组
 * @return 最终结果
 */
uint32_t GRAY_multiRead(uint32_t gray_judgeNum[5]) 
{
    uint32_t result = 0; 

    for (uint8_t bit = 0; bit < 10; ++bit)          // 遍历每一位，从最低位到第10位
    {
        uint8_t count = 0;                          // 计算当前位上1的个数
        
        for (uint8_t i = 0; i < 5; ++i)             // 遍历数组中的每个数字
            if (gray_judgeNum[i] & (1 << bit))      
                count++;                            // 如果当前位是1

        if (count > 3)                              // 如果1的个数超过3                      
            result |= (1 << bit);                   // 设置结果数字的当前位为1
    }

    return result; 
}


uint8_t GRAY_Situation(uint32_t GrayNum)
{
	switch (GrayNum)
	{
		case 48:		return 0;		//0000110000
		case 0:         return 0;		//0000000000
				
		case 32:		return 1;   	//0000100000
				
		case 96:		return 2;		//0001100000
		case 224:       return 2;		//0011100000
		case 160:		return 2;		//0010100000
				
		case 64:		return 3;   	//0001000000
		case 192:		return 3;		//0011000000
				
		case 128:		return 4;		//0010000000
		case 448:		return 4;   	//0111000000
				
		case 384:		return 5;		//0110000000
		case 256:       return 5;		//0100000000
				
		case 512:       return 6;		//1000000000
		case 768:       return 6;		//1100000000
				
		case 16:		return -1;  	//0000010000
		
		case 24:		return -2;  	//0000011000
					
		case 28:		return -3;  	//0000011100
		case 8:			return -3;  	//0000001000
				
		case 31:		return -4;  	//0000011111
		case 30:		return -4;  	//0000011110
		case 12:		return -4;  	//0000001100
		case 4:			return -4;  	//0000000100
						
		case 15:		return -5;  	//0000001111
		case 14:		return -5;  	//0000001110
		case 6:			return -5;  	//0000000110
					
		case 7:			return -6;  	//0000000111
		case 2:			return -6;  	//0000000010
		case 3:			return -6;  	//0000000011
					
		case 1:			return -7;  	//0000000001

		default:
					    return 0;
	}
}


uint8_t Gray_CrossJudge(void)
{
	if(DL_GPIO_readPins(LED1_4_PORT,LED1_4_PIN) != 0)
		return 0;
	if(DL_GPIO_readPins(LED1_5_PORT,LED1_5_PIN) != 0)
		return 0;
	if(DL_GPIO_readPins(LED1_6_PORT,LED1_6_PIN) != 0)
		return 0;
	if(DL_GPIO_readPins(LED1_7_PORT,LED1_7_PIN) != 0)
		return 0;
	if(timer.count <= 200)		// 时间太短，重复检测
		return 0;
	return 1;
}

uint8_t Gray_MidJudge(void)
{
	if(DL_GPIO_readPins(LED1_5_PORT,LED1_5_PIN) != 0 ||
	   DL_GPIO_readPins(LED1_6_PORT,LED1_6_PIN) != 0)
		return 0;
	if(timer.count <= 500)		// 时间太短，重复检测
		return 0;
	return 1;
}


uint8_t Gray_TJudge(void)		//T字判断
{	
	if(  DL_GPIO_readPins(LED1_1_PORT,LED1_1_PIN) == 0 &&
		 DL_GPIO_readPins(LED1_2_PORT,LED1_2_PIN) == 0 &&
		 DL_GPIO_readPins(LED1_3_PORT,LED1_3_PIN) == 0 &&
		 DL_GPIO_readPins(LED1_4_PORT,LED1_4_PIN) == 0 &&
		 DL_GPIO_readPins(LED1_5_PORT,LED1_5_PIN) == 0	)
			return 1;
	
	if(  DL_GPIO_readPins(LED1_6_PORT, LED1_6_PIN)  == 0 &&
		 DL_GPIO_readPins(LED1_7_PORT, LED1_7_PIN)  == 0 &&
		 DL_GPIO_readPins(LED1_8_PORT, LED1_8_PIN)  == 0 &&
		 DL_GPIO_readPins(LED1_9_PORT, LED1_9_PIN)  == 0 &&
		 DL_GPIO_readPins(LED1_10_PORT,LED1_10_PIN) == 0 )
			return 1;
	
	return 0;
}


//uint8_t GRAY3_Judge(void)
//{
//	if(DL_GPIO_readPins(LED3_1_PORT,LED3_1_PIN) != 0)
//		return 0;
//	return 1;
//}

//uint8_t GRAY4_Judge(void)
//{
//	if(DL_GPIO_readPins(LED4_1_PORT,LED4_1_PIN) != 0)
//		return 0;
//	return 1;
//}

int GRAY_Error(void)
{
	uint32_t GrayNum = GRAY1_Calc();
	switch (GrayNum)
	{
		case 48:		return 0;	//0000110000
		case 0:     	return 0;	//0000000000
	
		case 32:		return 1;   //0000100000
	
		case 96:		return 2;	//0001100000
		case 224:   	return 2;	//0011100000
		case 160:		return 2;	//0010100000
	
		case 64:		return 3;   //0001000000
		case 192:		return 3;	//0011000000
	
		case 128:		return 4;	//0010000000
		case 448:		return 4;   //0111000000
	
		case 384:		return 5;	//0110000000
		case 256:   	return 5;	//0100000000
	
		case 512:   	return 6;	//1000000000
		case 768:   	return 6;	//1100000000
	
		case 16:		return -1;  //0000010000
		case 24:		return -1;  //0000011000
		
		case 8:			return -2;  //0000001000
		
		case 12:		return -3;  //0000001100
//		case 4:			return -3;  //0000000100
		
		case 6:			return -4;  //0000000110
		
		case 2:			return -5;  //0000000010
		case 3:			return -5;  //0000000011
		
		case 1:			return -6;  //0000000001

			default:
				return 0;
	}
}